package com.devframe.sysconfig.storage.operate.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.devframe.sys.util.assertion.Assert;
import com.devframe.sysconfig.storage.operate.ReaderCacheData;
import com.devframe.sysconfig.storage.operate.WriterCacheData;
import com.devframe.sysconfig.storage.operate.SysConfigDataOperate;

@Component(value="readerCacheData")
public class ReaderCacheDataImpl extends SysConfigDataOperate implements
		ReaderCacheData {
	
	@Autowired
	private WriterCacheData writerCacheData;

	public Map getCodeMap(String codeTableName) {
        Assert.notNull(codeTableName,"表码表别名不能为null");
        codeTableName=codeTableName.trim().toUpperCase();
//        Assert.state(!super.getSysConfigDataCache().containsKeyInCodeTableSet(codeTableName),"没有配置别名为：" + codeTableName + "的表码表，请检查T_INIT_LOAD_TABLE的设置");
        //加入同步判断
        Map codeMap=null;
        if (!super.getSysConfigDataCache().containsKeyInCodeTable(codeTableName)) {
            codeMap = this.writerCacheData.addCodeTable(codeTableName);
        }else{
        	codeMap=super.getSysConfigDataCache().getCodeTable(codeTableName);
        }
        return codeMap;
	}

	
	 /**
     * 代码名称翻译
     * @param codeId 代码表
     * @param value 代码
     * @return 名称
     * 
     */
    public String getCodeName(String codeTableName, String value) {
        if (StringUtils.isEmpty(codeTableName) || StringUtils.isEmpty(value)) {
            return null;
        }
        //转为大写
        codeTableName=codeTableName.trim().toUpperCase();
        
        Map dataMap = getCodeMap(codeTableName);
        if (dataMap == null) {
//            logger.warn("找不到表码表:" + codeTableName);
            return null;
        }
        //去空格
        value=value.trim();
        return (String)dataMap.get(value);
    }
    
    /**
     * 代码名称翻译
     * @param codeId 代码表
     * @param value 代码
     * @param defaultName 默认名称
     * @return 名称
     * 
     */
    public String getCodeName(String codeTableName, String value, String defaultName) {
        String name = this.getCodeName(codeTableName, value);
        if (StringUtils.isNotEmpty(name)) {
            return name;
        }
        return defaultName;
    }
    
////////////////////////////系统参数操作///////////////////////
    
	public boolean containsKeyInSysParam(String key) {
		return super.getSysConfigDataCache().containsKeyInSysParam(key);
	}
	/**
	* @param key 参数名
	* @return 整型参数值
	*/
	public int getIntSysParam(String key) {
		String value = getSysParam(key);
		return NumberUtils.toInt(value);
	}
	
	/**
	* 获取参数值
	* @param key 参数名
	* @return 字符串参数值
	*/
	public String getSysParam(String key) {
		Assert.notNull(key, "系统参数名不能为空");
		key=key.trim();
		Assert.state(super.getSysConfigDataCache().containsKeyInSysParam(key), "没有名为：" + key + "系统参数名，请检查T_SYS_PARAMETER表的设置。");
		return (String) super.getSysConfigDataCache().getSysParam(key.trim());
	}
	/**
	* 获取布尔参数值，"true"或者"1"当做true,其他当做false
	* @param key 参数名
	* @return bool参数值
	*/
	public boolean getBoolSysParam(String key){
		String value = getSysParam(key);
		return "true".equalsIgnoreCase(value) || "1".equals(value);
	}
/////////////////////控制表操作///////////////////////////////
	public boolean containsKeyInCtrlTableSet(String tableAlias) {
		return super.getSysConfigDataCache().containsKeyInCtrlTable(tableAlias);
	}


	public boolean containsKeyInCtrlTable(String tableAlias) {
		return super.getSysConfigDataCache().containsKeyInCtrlTable(tableAlias);
	}



	public String getCtrlTableSet(String tableAlias) {
		return super.getSysConfigDataCache().getCtrlTableSet(tableAlias);
	}


	public List getCtrlTable(String tableAlias) {
	
		//加入同步
		Assert.notNull(tableAlias, "表码表别名不能为null");
		Assert.state(this.getSysConfigDataCache().containsKeyInCtrlTableSet(tableAlias), "没有配置的控制表:"+tableAlias);
		if(!this.getSysConfigDataCache().containsKeyInCtrlTable(tableAlias)){
			List list=this.writerCacheData.addCtrlTable(tableAlias);
		    super.getSysConfigDataCache().addCtrlTable(tableAlias, list);
		}
		return super.getSysConfigDataCache().getCtrlTable(tableAlias);
	}

	/**
     * 控制表缓存查询——查询符合条件的记录的目标字段值
     * @param tableAliasName 别名
     * @param colNameArr 过滤字段列表
     * @param colValueArr 过滤值列表
     * @param destCol 目标字段
     * @return 目标字段值
     * 
     */
	public String getCtrlTableItemVal(String tableAliasName, String[] colNameArr, String[] colValueArr, String destCol) {
		List configTable = this.getCtrlTable(tableAliasName);
		for(Iterator it = configTable.iterator(); it.hasNext();){
			Map config = (Map)it.next();
			boolean selected = true;
			for(int i = 0; i < colNameArr.length; i++){
				if(config.get(colNameArr[i]) == null || !colValueArr[i].equals(config.get(colNameArr[i]).toString())){
					selected = false;
				}
			}
			if(selected){
			    return (String)config.get(destCol);
			}
		}
		return null;
	}

	/**
	 * 控制表缓存查询-根据字段名和字段条件查询记录列表
     * @param tableAliasName 别名
     * @param colName 字段名
     * @param colValue 字段值 
     * @param destCol 目标字段
     * @return 符合条件的记录的目标字段值
     * 
     */
	public String getCtrlTableItemVal(String tableAliasName, String colName, String colValue, String destCol) {
		List configTable = this.getCtrlTable(tableAliasName);
		for(Iterator it = configTable.iterator(); it.hasNext();){
			Map config = (Map)it.next();
			if(colValue.equals(config.get(colName))){
				return (String)config.get(destCol);
			}
		}
		return null;
	}



	/**
	 * 控制表缓存查询-根据字段名和字段条件查询记录列表
     * @param tableAliasName 别名
     * @param colName 字段名
     * @param colValue 字段值 
     * @return 符合条件的记录
     * 
     */
	public List getCtrlTableItems(String tableAliasName, String colName, String colValue) {
	    return this.getCtrlTable(tableAliasName,new String[]{colName},new String[]{colValue});
	}
	
	/**
     * 单行查询缓存控制表记录
     * @param tableAlias tableAlias
     * @param colName 字段名
     * @param colValue 字段值
     * @return 一行记录，无则返回Null
     * 
     */
	public Map queryCtrlTableRow(String tableAlias, String colName, String colValue) {
		List configTable = this.getCtrlTable(tableAlias);
		for(Iterator it = configTable.iterator(); it.hasNext();){
			Map config = (Map)it.next();
			if(colValue.equals(config.get(colName))){
				return config;
			}
		}
		return null;
	}

	/**
	 * 控制表缓存查询
     * @param tableAliasName 别名
     * @param colNameArr 过滤字段列表
     * @param colValueArr 过滤值列表
     * @return 记录列表List
     * 
     */
	public List getCtrlTable(String tableAliasName, String[] colNameArr, String[] colValueArr) {
		List configTable = this.getCtrlTable(tableAliasName);
		List configValues = new ArrayList();
		for(Iterator it = configTable.iterator(); it.hasNext();){
			Map config = (Map)it.next();
			boolean selected = true;
			for(int i = 0; i < colNameArr.length; i++){
				if(config.get(colNameArr[i]) != null && !colValueArr[i].equals(config.get(colNameArr[i]).toString())){
					selected = false;
					break;
				}
			}
			if(selected){
				configValues.add(config);
			}
		}
		return configValues;
	}


	public WriterCacheData getWriterCacheData() {
		return writerCacheData;
	}


	public void setWriterCacheData(WriterCacheData writerCacheData) {
		this.writerCacheData = writerCacheData;
	}

}
